package com.example.finalexamcovid_19situations;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class wuZiXuan1 extends AppCompatActivity {
    Button button,button2,button3,button4,button5;

    //爬取绘图和json的变量
    JSONArray historyListJson;
    String url="https://news.sina.com.cn/project/fymap/ncp2020_full_data.json" +
            "?_=1653210512520&callback=jsoncallback";//新浪疫情数据的网址，要确定虚拟机有网

    JSONArray cityData;
    //北京 上海 广州 深圳 成都 重庆 杭州 武汉 青岛 天津 东莞
    int [][] cityIndex={{1}, {15}, {3, 3}, {3, 4}, {9, 3},
            {7}, {4, 3},{2, 3}, {10, 4},{23},
            {3, 5}};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wu_zi_xuan1);

        //调取爬取函数，并创建数据库
        volleyRequest();

        button=(Button) findViewById(R.id.button5);
        button2=(Button) findViewById(R.id.button3);
        button3=(Button) findViewById(R.id.button11);
        button4=(Button) findViewById(R.id.button2);
        button5=(Button) findViewById(R.id.button22);

        button5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //调取爬取函数，更新数据库
                volleyRequest();
            }
        });
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(wuZiXuan1.this,maDaWei.class);
                startActivity(intent);
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(wuZiXuan1.this,jiangYongKe.class);
                startActivity(intent);
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(wuZiXuan1.this,liuJiaQi.class);
                startActivity(intent);
            }
        });
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(wuZiXuan1.this,wuZiXuan2.class);
                startActivity(intent);
            }
        });
    }

    //volley爬取网页
    void volleyRequest(){
        /*
        创建一个请求队列，不能直接在代码开始那边创建，会报错
        volley是一个和线程有关的函数，所以相关代码最简单的是写道volley里面
        我个傻子，非想把volley和string转换json代码分开写，浪费了很多时间
        */

        //爬取代码
        StringBuffer stringBufferData=new StringBuffer();
        RequestQueue requestQueue= Volley.newRequestQueue(wuZiXuan1.this);    //创建RequestQueue放Request类
                    /*
                    新浪json代码有一个函数，volley不能直接爬取json所以使用stringRequest爬取，
                    用StringBuffer删除函数，用jsonObject转json
                    */
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,        //创建stringRequest爬取url
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {             //将赋值stingData，方便之后判空减少等待
                        //将爬取的新浪string转标准格式json
                        stringBufferData.append(response);  //将string放到stringBuffer中方便处理
                        stringBufferData.delete(0,13);      //删除前14个字符
                        stringBufferData.delete(stringBufferData.length()-2,stringBufferData.length());     //删除后四个字符
                        try {
                            //转化String为JSONObject，并提取历史记录到historyListJson
                            JSONObject jsonData =new JSONObject(stringBufferData.toString());
                            JSONObject dataJson=jsonData.getJSONObject("data");
                            historyListJson=dataJson.getJSONArray("historylist");

                            //城市爬取
                            //jsonStr转json
//                            cityIndexJson=new JSONArray(jsonStr);
                            cityData=dataJson.getJSONArray("list");
                            String[][] data=new String[cityIndex.length][2];
                            for (int i = 0; i<cityIndex.length; i++) {
                                //现有econNum，增加conadd
                                if (cityIndex[i].length==1){
                                    data[i][0]=cityData.
                                            getJSONObject(cityIndex[i][0]-1).
                                            get("econNum").toString();
                                    data[i][1]=cityData.
                                            getJSONObject(cityIndex[i][0]-1).
                                            get("conadd").toString();
                                }else {
                                    data[i][0]=cityData.getJSONObject(cityIndex[i][0]-1).
                                            getJSONArray("city").
                                            getJSONObject(cityIndex[i][1]-3).
                                            get("econNum").toString();
                                    data[i][1]=cityData.getJSONObject(cityIndex[i][0]-1).
                                            getJSONArray("city").
                                            getJSONObject(cityIndex[i][1]-3).
                                            get("conadd").toString();
                                }
                            }
                            openOrCreateCitySQL("china.db","city");
                            insertCitySQL("china.db","city",data);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        String[][] data=getRecentDays(historyListJson,7);
                        openOrCreateSQL("china.db","total");
                        insertSQL("china.db","total",data);
//                        String[][] ii= querySQL("china.db","total");

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
//                textView.setText("爬取错误");
                Toast.makeText(wuZiXuan1.this, "获取数据失败！", Toast.LENGTH_SHORT).show();
            }
        });
        //将创建的string请求添加到请求队列当中
        requestQueue.add(stringRequest);
    }

    //已摸清json的省份序列，并写出了json文件见sfxx.json
    //todo 寻找以下省份代码和城市代码，并构建string二维数组
    //北京、上海、广州、深圳 成都、重庆、杭州、武汉、西安、郑州、青岛、长沙、天津、苏州、南京、东莞、沈阳、合肥、佛山
    //1,1 15,1 3,3 3,4 9,3 7,1 4,3 2,3 18,4 5,4 10,4 6,5 23,1 14,8 14,4 3,5 21,4 8,7 3,9
    //todo 按照传入省份值和城市值返回相应省份信息

    //从jsonArray中获取最近的几天days，超出范围则置最大值，逆序
    String [][] getRecentDays(JSONArray jsonArray, int days){
        if (days>jsonArray.length())
            days=jsonArray.length();
        JSONArray jsonArrayRD=new JSONArray();
        String [][] historyList=new String[days][3];
        int lastDaysNum;
        for (int i=days-1;i>=0;i--){
            try {
                //日期，现有，新增
                JSONObject jsonObject=jsonArray.getJSONObject(i);
//                historyList[i][0]=jsonObject.get("ymd").toString();
                historyList[i][0]=jsonObject.get("date").toString();
                historyList[i][1]=jsonObject.get("cn_province_econNum").toString();
                if (i==days-1){
                    //第一次则取前一天减今天，无前一天则数据为0
                    if (days==jsonArray.length()){
                        historyList[i][2]="0";
                    }else{
                        JSONObject lastJsonObject=jsonArray.getJSONObject(days);
                        historyList[i][2]= String.valueOf(Integer.parseInt(lastJsonObject.get("cn_province_econNum").toString())-
                                Integer.parseInt(historyList[i][1]));
                    }
                }else{
                    //今天减昨天，获取新增
                    historyList[i][2]=String.valueOf(Integer.parseInt(historyList[i][1])-Integer.parseInt(historyList[i+1][1]));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return historyList;
    }

    //打开数据库
    void openOrCreateSQL(String name,String tableName){
        SQLiteDatabase sqLiteDatabase=openOrCreateDatabase(name, Context.MODE_PRIVATE,null);
        //删除表SQL语句,并执行SQL语句，try catch防止第一次建库报错
        String deleteTable="drop table "+tableName;
        try {
            sqLiteDatabase.execSQL(deleteTable);
        }catch (SQLiteException sqLiteException){}
        //创建表SQL语句,并执行SQL语句
        String createTable="create table "+tableName+"(ymd text,num integer,change_num integer)";
        sqLiteDatabase.execSQL(createTable);
    }

    //插入数据
    void insertSQL(String name,String tableName,String[][] data){
        //将数据插入数据库
        SQLiteDatabase sqLiteDatabase=openOrCreateDatabase(name,Context.MODE_PRIVATE,null);
        //实例化常量值
        ContentValues cValue = new ContentValues();
        for (int i=0;i<data.length;i++){
            //添加数据
            cValue.put("ymd",data[i][0]);
            cValue.put("num",data[i][1]);
            cValue.put("change_num",data[i][2]);
            //调用insert()方法插入数据123
            sqLiteDatabase.insert(tableName,null,cValue);
        }
    }

    //打开城市数据库
    void openOrCreateCitySQL(String name,String tableName){
        SQLiteDatabase sqLiteDatabase=openOrCreateDatabase(name,Context.MODE_PRIVATE,null);
        //删除表SQL语句,并执行SQL语句，try catch防止第一次建库报错
        String deleteTable="drop table "+tableName;
        try {
            sqLiteDatabase.execSQL(deleteTable);
        }catch (SQLiteException sqLiteException){}
        //创建表SQL语句,并执行SQL语句，现有econNum，增加conadd
        String createTable="create table "+tableName+"(num integer,change_num integer)";
        sqLiteDatabase.execSQL(createTable);
    }
    //插入城市数据
    void insertCitySQL(String name,String tableName,String[][] data){
        //将数据插入数据库
        SQLiteDatabase sqLiteDatabase=openOrCreateDatabase(name,Context.MODE_PRIVATE,null);
        //实例化常量值
        ContentValues cValue = new ContentValues();
        for (int i=0;i<data.length;i++){
            //添加数据
            cValue.put("num",data[i][0]);
            cValue.put("change_num",data[i][1]);
            //调用insert()方法插入数据123
            sqLiteDatabase.insert(tableName,null,cValue);
        }
    }

}